/**
 * @作者 伟子涵
 * @微信公号 搬砖暗夜码农
 * @开源项目 $ https://gitee.com/zhouwei5208888
 * @我的博客 $ http://itzhouwei.com
 * @创建时间 2023/12/15  9:40
 */
package com.itzhouwei.commerce.service;

import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;

/**
 * @description: 聚合实现层
 * @author：zw，微信：yingshengzw
 * @date: 2023/12/15  9:40 
 * @Copyright： 公众号：搬砖暗夜码农 | 博客：https://itzhouwei.com - 沉淀、分享、成长，让自己和他人都能有所收获！
 */
@Service
public class ZwQueryGrantTypeService {

    /****
     * 根据优惠券(资源)类型resourceType和编码resourceId查询派发方式grantType
     * 1. if else  switch case
     * 2. 策略模式  以前就说过，策略模式，就是把一系列的算法封装到一个类中，从而使它们可以相互替换，从而使算法的变化，
     * 不会影响到使用算法的客户。
     * 3. Map+函数式接口  替换策略 if else
     *
     * 策略模式通过接口、实现类、逻辑分派来完成，把 if语句块的逻辑抽出来写成一个类，更好维护。
     *
     * Map+函数式接口通过Map.get(key)来代替 if-else的业务分派，能够避免策略模式带来的类增多、
     * 难以俯视整个业务逻辑的问题。
     *
     */

    private final GrantTypeSerive grantTypeSerive;
    private Map<String, Function<String,String>> grantTypeMap=new HashMap<>();

    public ZwQueryGrantTypeService(GrantTypeSerive grantTypeSerive) {
        this.grantTypeSerive = grantTypeSerive;
    }


    /**
     *  <h1>初始化业务分派逻辑,代替了if-else部分</h1>
     *  key: 优惠券类型
     *  value: lambda表达式,最终会获得该优惠券的发放方式
     */
    @PostConstruct
    public void dispatcherInit(){
        grantTypeMap.put("Max会员抵惠券", grantTypeSerive::getMaxVip);
        grantTypeMap.put("绿盾会员抵扣卷", grantTypeSerive::getGreenShieldVip);
        grantTypeMap.put("超电会员抵扣卷", grantTypeSerive::getSuperchargeVip);
    }


    public String getResult(String resourceType){
        /** Controller根据 优惠券类型resourceType、去查询 发放方式grantType **/
        Function<String,String> result=grantTypeMap.get(resourceType);

        if(result!=null){

            //传入resourceTyp 执行这段表达式获得String型的grantType
            return result.apply(resourceType);
        }
        return "查询不到该优惠券的发放方式";
    }
}
